package com.mycompany.crm.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mycompany.crm.base.BaseService;
import com.mycompany.crm.dao.SaleChanceMapper;
import com.mycompany.crm.enums.DevResult;
import com.mycompany.crm.enums.StateStatus;
import com.mycompany.crm.query.SaleChanceQuery;
import com.mycompany.crm.service.SaleChanceService;
import com.mycompany.crm.utils.AssertUtil;
import com.mycompany.crm.utils.PhoneUtil;
import com.mycompany.crm.vo.SaleChance;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author jy
 * @version 1.0
 * @date 2022/1/11 19:46
 */
@Service
public class SaleChanceServiceImpl extends BaseService<SaleChance,Integer> implements SaleChanceService{

    @Resource
    private SaleChanceMapper saleChanceMapper;

    /**
     * 多条件分页查询营销机会
     * @param saleChanceQuery
     * @return
     */
    @Override
    public Map<String,Object> querySaleChanceByParams(SaleChanceQuery saleChanceQuery){
        //返回的格式必须是layui中表格呈现要求的格式map
        HashMap<String, Object> map = new HashMap<>();

        //开启分页
        PageHelper.startPage(saleChanceQuery.getPage(),saleChanceQuery.getLimit());
        //得到对应的分页对象
        PageInfo<SaleChance> pageInfo = new PageInfo<>(saleChanceMapper.selectByParams(saleChanceQuery));

        //设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        //设置分好页的列表
        map.put("data",pageInfo.getList());
        return map;
    }

    /**
     * 添加营销机会
     * @param saleChance
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void addSaleChance(SaleChance saleChance){
        /*1.校验参数(添加时，客户名，联系人和联系电话是不能为空的，且联系号码格式要正确)*/
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());

        /*2.设置相关字段的默认值*/
        //isValid是否有效  （0=无效，1=有效）设置为有效 1= 有效
        saleChance.setIsValid(1);
        //创建时间默认为当前时间
        saleChance.setCreateDate(new Date());
        //修改时间默认为当前时间
        saleChance.setUpdateDate(new Date());
        //判断是否设置了指派人
        if (StringUtils.isBlank(saleChance.getAssignMan())){
            //指派人为空
            saleChance.setState(StateStatus.UNSTATE.getType());
            saleChance.setAssignTime(null);
            saleChance.setDevResult(DevResult.UNDEV.getStatus());
        }else {
            //设置了指派人
            saleChance.setState(StateStatus.STATED.getType());
            saleChance.setAssignTime(new Date());
            saleChance.setDevResult(DevResult.DEVING.getStatus());
        }

        /*3.执行添加操作，判断受影响的行数*/
        AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance) != 1,"添加营销机会失败！");

    }

    /**
     * 参数非空校验方法(参数为客户名，联系人和联系号码)
     * @param customerName
     * @param linkMan
     * @param linkPhone
     */
    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {
        //customerName(客户名) 非空
        AssertUtil.isTrue(StringUtils.isBlank(customerName),"客户名称不能为空！");
        //linkMan联系人 非空
        AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空！");
        //linkPhone 联系号码 非空
        AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系号码不能为空！");
        //linkPhone 联系号码格式要正确
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"联系号码格式不正确！");
    }

    /**
     * 更新营销机会
     * @param saleChance
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void updateSaleChance(SaleChance saleChance){
        //1.营销ID不能为空
        AssertUtil.isTrue(null == saleChance.getId(),"待更新记录不存在！");
        //2.且在数据库通过查询中有对应记录
        SaleChance temp = saleChanceMapper.selectByPrimaryKey(saleChance.getId());
        AssertUtil.isTrue(null == temp,"待更新记录不存在！");
        //参数校验
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());
        //修改时间默认为当前时间
        saleChance.setUpdateDate(new Date());

        //修改前后指派人是否存在的不同情况判断
        assert temp != null;
        //修改前指派人的值不存在
        if (StringUtils.isBlank(temp.getAssignMan())){
            //修改前指派人不存在，修改后存在
            if (!StringUtils.isBlank(saleChance.getAssignMan())){
                saleChance.setAssignTime(new Date());   //系统当前时间
                saleChance.setState(StateStatus.STATED.getType());  //已分配
                saleChance.setDevResult(DevResult.DEVING.getStatus());  //开发中
            }
        }else {  //修改前指派人的值存在
            //修改前存在，修改后不存在
            if (StringUtils.isBlank(saleChance.getAssignMan())){
                saleChance.setAssignTime(new Date());   //修改时间为系统当前时间
                saleChance.setState(StateStatus.UNSTATE.getType());  //未分配
                saleChance.setDevResult(DevResult.UNDEV.getStatus());  //未开发
            }else { //修改前存在，修改后也存在
                //判断修改前后是否为同一个指派人(若不是则需要更新时间)
                if (!saleChance.getAssignMan().equals(temp.getAssignMan())){
                    saleChance.setAssignTime(new Date());
                }else {
                    //如果更行前后指派人不变，则指派时间保留为修改前的时间
                    saleChance.setAssignTime(temp.getAssignTime());
                }
            }
        }
        //执行更新操作，判断受影响的行数
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"更新营销机会失败！");
    }


    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void deleteSaleChance(Integer[] ids){
        //判断Id是否为空
        //判断ids是否为空，长度是否大于0
        AssertUtil.isTrue(ids == null || ids.length < 1,"待删除的记录不存在！");
        //执行删除(实际是更新)操作,判断受影响的行数
        assert ids != null;
        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) != ids.length,"营销机会数据删除失败！");
    }

    /**
     * 更新营销机会开发状态
     * @param id
     * @param devResult
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void updateSaleChanceDevResult(Integer id, Integer devResult) {
        //通过id查询营销机会数据
        SaleChance saleChance = saleChanceMapper.selectByPrimaryKey(id);
        //判断id是否为空或对应营销机会不存在
        AssertUtil.isTrue(null == id || saleChance == null,"待更新记录不存在！");
        //设置开发状态
        assert saleChance != null;
        saleChance.setDevResult(devResult);
        //执行更新操作，判断受影响的行数
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"开发状态更新失败！");
    }
}
